package com.jiangxjsy.gateway.filter;

import com.jiangxjsy.core.constant.GatewayConstant;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Map;

/**
 * wukong-crm-master
 * 蒋胜宇
 * 2025/5/31 13:55
 *
 * <p>
 * 忽略拦截过滤器
 * </p>
 *
 * <p>
 * 该过滤器判断当路由中携带的参数 intercept 为 0 时，则不进行权限校验
 * 其携带的 intercept 参数来自数据库表中路由数据的 intercept 字段参数
 * - 扩展 -
 * router.RouteRepository中已经加载了来自数据库中的路由配置，包括负载均衡
 * 从前端的请求和数据库中定义的路由配置并没有强相关性，只有一个 intercept 来判断其是否应该忽略拦截，
 * 但一般来说如果请求包含 intercept 参数，且值为 0 导致其被忽略拦截，
 * 其也间接说明了该请求是数据库中定义的路由配置的请求其中之一，所以最后其也会触发网关的负载均衡策略
 * </p>
 */

@Component
public class IgnoreInterceptFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        if (exchange.getAttribute(GatewayConstant.SKIP_SUBSEQUENT_FILTERS) != null) {
            return chain.filter(exchange);
        }

        Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
        if (route != null) {
            Map<String, Object> metadata = route.getMetadata();
            if (GatewayConstant.ROUTER_INTERCEPT_OK.toString().equals(String.valueOf(metadata.get(GatewayConstant.ROUTER_INTERCEPT)))) {
                exchange.getAttributes().put(GatewayConstant.SKIP_SUBSEQUENT_FILTERS, true);
                return chain.filter(exchange);
            }
        }

        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        // 忽略拦截过滤器第 2 执行
        return GatewayConstant.FILTER_HIGHEST_ORDER + 1;
    }
}
